<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Unse_model extends CI_Model {
	
	var $request_params;

	function __construct() {
		parent::__construct();
	}

	/**
	 * 운세 데이터DB에서 운세 결과를 가져온다.
	 * 결과는 JSON
	 */
	function make_unse_data($userinfo, $api_name) {
		log_message('debug',"#### Unse_model::make_unse_data($userinfo, $api_name)");

		$url = "http://218.145.66.136/UNSE_DATA/api/$api_name.asp";
		$req = new HttpRequest($url, HttpRequest::METH_POST);
		$req->addPostFields($userinfo);

		$this->request_params = '';
		foreach ($userinfo as $key => $value) {
			$this->request_params .= $key.'='.$value.'&';
			if ($key == 'page') {
				break;
			}
//			log_message('debug',"## 운세 전송 파라미터 : $key=$value");
		}
		log_message('debug','## 운세 데이터 요청 URL : '.$url.'?'.$this->request_params);
		
		try {
			$return_obj = json_decode($req->send()->getBody(), TRUE);
			$this->logsql->log_result($return_obj);
			return $return_obj;
		} catch (HttpException $ex) {
			log_message('error','## 운세데이터를 가져오는 중 에러 발생');
			log_message('error','## ERROR='.json_last_error());
			echo $ex;
		}
	}

	function make_sajums_data($userinfo) {
		log_message('debug',"#### Unse_model::make_sajums_data($userinfo)");

		$your_data['yyyy']          = $userinfo['yyyy'];
		$your_data['user_name']     = $userinfo['your_user_name'];
		$your_data['solunar']       = $userinfo['your_solunar'];
		$your_data['my_solnuar']    = $userinfo['your_solunar'];
		$your_data['request_year']  = $userinfo['your_year'];
		$your_data['request_month'] = $userinfo['your_month'];
		$your_data['request_day']   = $userinfo['your_day'];
		$your_data['request_hour']  = $userinfo['your_hour'];
		$your_data['sex']           = $userinfo['your_sex'];
		$your_data['youn']          = $userinfo['your_youn'];			
			

		$url = "http://218.145.66.136/UNSE_DATA/api/sajums.asp";
		$req = new HttpRequest($url, HttpRequest::METH_POST);
		$req->addPostFields($your_data);

		$request_params = '';
		foreach ($your_data as $key => $value) {
			$request_params .= $key.'='.$value.'&';
			if ($key == 'page') {
				break;
			}
//			log_message('debug',"## 운세 전송 파라미터 : $key=$value");
		}
		log_message('debug','## 사주명식 데이터 요청 URL : '.$url.'?'.$request_params);
		
		try {
			$return_obj = json_decode($req->send()->getBody(), TRUE);
			$this->logsql->log_result($return_obj);
			return $return_obj;
		} catch (HttpException $ex) {
			log_message('error','## 운세데이터를 가져오는 중 에러 발생');
			echo $ex;
		}
	}

	/**
	 * 회원정보와 가입상품 정보 가져오기
	 * package_cd는 비회원이면 0, 회원이면 1로 세팅
	 */
	function get_member_with_package($user_id) {
		log_message('debug',"#### Unse_model::get_member_with_package($user_id)");

		$default_prem_cd = $user_id == 'guests' ? PREM_GUEST : PREM_GENERAL;

		$sql  = PHP_EOL." SELECT M.* ";
		$sql .= PHP_EOL."     , P.point ";
		$sql .= PHP_EOL."     , P.cash ";
		$sql .= PHP_EOL."     , (P.point+P.cash) cashpoint ";
		$sql .= PHP_EOL."     , IFNULL( ( SELECT package_cd ";
		$sql .= PHP_EOL."         FROM  tb_member_package  ";
		$sql .= PHP_EOL."         WHERE user_id = M.user_id ";
		$sql .= PHP_EOL."         AND   DATE_FORMAT(CURDATE(),'%Y%m%d') BETWEEN start_dt AND end_dt ";
		$sql .= PHP_EOL."       ), '$default_prem_cd' ) package_cd ";
		$sql .= PHP_EOL." FROM  tb_member M ";
		$sql .= PHP_EOL."     , tb_point P ";
		$sql .= PHP_EOL." WHERE M.user_id = P.user_id ";
		$sql .= PHP_EOL." AND   M.user_id = ?  ";
		$query = $this->db->query($sql, array($user_id)) or $this->logsql->log_sql('error');
		$result = $query->row_array();
		
		$this->logsql->log_sql();
		$this->logsql->log_result($result);

		return $result;
	}

	/**
	 * 이용중인 패키지의 잔여 쿠폰 리스트
	 */
	function select_member_coupon_list($user_id) {
		log_message('debug',"#### Unse_model::select_member_coupon_list($user_id)");

		$sql  = PHP_EOL." SELECT ";
		$sql .= PHP_EOL."       C.idx  ";
		$sql .= PHP_EOL."     , C.service_group_id  ";
		$sql .= PHP_EOL."     , (SELECT service_group_name FROM tb_service_group WHERE service_group_id = C.service_group_id) service_group_name  ";
		$sql .= PHP_EOL."     , C.qty  ";
		$sql .= PHP_EOL." FROM  tb_member_package_coupon C ";
		$sql .= PHP_EOL." WHERE idx = ( ";
		$sql .= PHP_EOL."         SELECT MP.idx ";
		$sql .= PHP_EOL."         FROM  tb_member_package MP ";
		$sql .= PHP_EOL."         WHERE DATE_FORMAT(CURDATE(),'%Y%m%d') BETWEEN MP.start_dt AND MP.end_dt ";
		$sql .= PHP_EOL."         AND   MP.user_id = ? ";
		$sql .= PHP_EOL." ) ";
		$query = $this->db->query($sql, array($user_id)) or $this->logsql->log_sql('error');
		$result = $query->result_array();
		
		$this->logsql->log_sql();
		$this->logsql->log_result($result);

		return $result;
	}

	/**
	 * 소유중인 개별이용권 리스트
	 * 개별 운세서비스에 대한 이용권과 대분류에 따른 이용권 모두 가져온다.
	 */
	function select_ticket_list($user_id, $service_group_id, $service_id) {
		log_message('debug',"#### Unse_model::select_ticket_list($user_id, $service_group_id, $service_id)");

		$sql  = PHP_EOL." SELECT * ";
		$sql .= PHP_EOL." FROM  tb_ticket T ";
		$sql .= PHP_EOL." WHERE T.user_id = ? ";
		$sql .= PHP_EOL." AND   T.used_yn = 'N' ";
		$sql .= PHP_EOL." AND   (T.service_group_id = ? OR T.service_id = ?) ";
		$sql .= PHP_EOL." AND   DATE_FORMAT(CURDATE(),'%Y%m%d') BETWEEN T.start_dt AND T.end_dt ";
		$query = $this->db->query($sql, array($user_id, $service_group_id, $service_id)) or $this->logsql->log_sql('error');
		$result = $query->result_array();
		
		$this->logsql->log_sql();
		$this->logsql->log_result($result);

		return $result;
	}


	/**
	 * 회원정보 가져오기
	 */
	function get_member($user_id) {
		log_message('debug',"#### Unse_model::get_member($user_id)");

		$sql  = PHP_EOL." SELECT M.*, P.point ";
		$sql .= PHP_EOL." FROM  tb_member M, tb_point P ";
		$sql .= PHP_EOL." WHERE M.user_id = P.user_id ";
		$sql .= PHP_EOL." AND   M.user_id = ? ";
		$query = $this->db->query($sql, array($user_id)) or $this->logsql->log_sql('error');
		$result = $query->row_array();
		
		$this->logsql->log_sql();
		$this->logsql->log_result($result);

		return $result;
	}

	/**
	 * 회원의 이용중인 상품 정보
	 */
	function get_member_package($user_id) {
		log_message('debug',"#### Unse_model::get_member_package($user_id)");

		$sql  = PHP_EOL." SELECT * ";
		$sql .= PHP_EOL." FROM  tb_member_package ";
		$sql .= PHP_EOL." WHERE DATE_FORMAT(CURDATE(),'%Y%m%d') BETWEEN start_dt AND end_dt ";
		$sql .= PHP_EOL." AND   user_id = ? ";
        $query = $this->db->query($sql, array($user_id)) or $this->logsql->log_sql('error');
		$result = $query->row_array();

		$this->logsql->log_sql();
		$this->logsql->log_result($result);

		return $result;
	}

	/**
	 * 해당 서비스의 이용등급을 가져온다.
	 */
	function get_service($service_id) {
		log_message('debug',"#### Unse_model::get_service($service_id)");

		$sql  = PHP_EOL." SELECT * FROM tb_service WHERE service_id = ? ";
        $query = $this->db->query($sql, array($service_id)) or $this->logsql->log_sql('error');
		$result = $query->row_array();

		$this->logsql->log_sql();
		$this->logsql->log_result($result);

		return $result;
	}
	
	/**
	 * 운세 서비스 이용 내역을 저장한다.
	 */
	 function insert_service_used_history($user_id, $service_id, $coupon_id, $package_idx, $ticket_idx, $cash, $point, $result_html_url) {
	 	log_message('debug',"#### Unse_model::insert_service_used_history($user_id, $service_id, $coupon_id, $package_idx, $ticket_idx, $cash, $point, $result_html_url)");

		$this->db->set('user_id'        , $user_id);
		$this->db->set('service_id'     , $service_id);
		$this->db->set('coupon_id'      , $coupon_id);
		$this->db->set('package_idx'    , $package_idx);
		$this->db->set('ticket_idx'     , $ticket_idx);
		$this->db->set('point'          , $point, FALSE);
		$this->db->set('cash'           , $cash, FALSE);
		$this->db->set('param_values'   , $this->request_params);
		$this->db->set('result_html_url', $result_html_url);
		$this->db->set('create_dt'      , 'now()', FALSE);
		$this->db->insert('tb_service_used_history') or $this->logsql->log_sql('error');

		$this->logsql->log_sql();
	 }

	/**
	 * 캐쉬,포인트 차감
	 */
	 function update_subtraction_point($user_id, $cash, $point) {
	 	log_message('debug',"#### Unse_model::update_subtraction_point($user_id, $cash, $point)");

		$this->db->set('point'    , 'point-'.$point, FALSE);
		$this->db->set('cash'     , 'cash-'.$cash, FALSE);
		$this->db->set('update_dt', 'now()', FALSE);
		$this->db->where('user_id', $user_id);
		$this->db->update('tb_point') or $this->logsql->log_sql('error');

		$this->logsql->log_sql();
	 }

	/**
	 * 캐쉬, 포인트 유효기간 테이블 잔액 업데이트
	 *  가장 먼저 적립된 포인트부터 차감시켜준다.
	 */
	 function update_point_charged_history_balance($user_id, $type, $point) {
	 	log_message('debug',"#### Unse_model::update_point_charged_history_balance($user_id, $type, $point)");

		$cur_point = $point;	// 차감시켜야 할 남은 캐쉬/포인트
		
		log_message('debug',"## cur_point=$cur_point");

		if ($type == 'cash') {
			$field_name = 'cash_balance';
		} elseif ($type == 'point') {
			$field_name = 'point_balance';
		}

		while (0 < $cur_point) {
			// 유효기간이 지나지 않은
			// 잔액이 남아있는
			// 가장 오래된 적립 내역을 가져온다.
			$this->db->where("$field_name > ",'0', FALSE);
			$this->db->where("DATE_FORMAT(CURDATE(),'%Y%m%d') BETWEEN ","start_dt AND end_dt", FALSE);
			$this->db->order_by('idx','asc');
			$this->db->limit('1');
			$query = $this->db->get('tb_point_charged_history');
			$history = $query->row_array();
	
			$this->logsql->log_sql();
			$this->logsql->log_result($history);

			// 무한루프 방지용
			if (empty($history)) {
				break;
			}
			
			// 차감가능한 포인트를 차감시키고 남은 포인트을 구한다.
			// db에 업데이트 할 포인트를 구한다.
			$tmp_point = $history[$field_name] - $cur_point;
			
			// 마이너스이면 0으로 해주고 계속 차감시켜야 할 포인트 값을 구한다.
			if ($tmp_point < 0) {
				$balance = 0;
				$cur_point = $cur_point - $history[$field_name];
			} else {
				$balance =$tmp_point;
				$cur_point = 0;
			}
			
			// db 업데이트
			$this->db->set($field_name, $balance, FALSE);
			$this->db->set('update_dt'   , 'now()', FALSE);
			$this->db->where('idx', $history['idx']);
			$this->db->update('tb_point_charged_history') or $this->logsql->log_sql('error');
	
			$this->logsql->log_sql();
		}
	 }

	/**
	 * 포인트로 결제
	 */
	 function payment_point($user_id, $service_id, $cash, $point, $result_html_url) {
	 	log_message('debug',"#### Unse_model::payment_point($user_id, $service_id, $cash, $point, $result_html_url)");

		$this->db->trans_start();
		
		// 캐쉬, 포인트 업데이트 
		$this->update_subtraction_point($user_id, $cash, $point);

		// 캐쉬, 포인트 유효기간 테이블 잔액 업데이트 
		$this->update_point_charged_history_balance($user_id, 'cash', $cash);	// 캐쉬
		$this->update_point_charged_history_balance($user_id, 'point', $point);	// 포인트
				
		// 운세 이용 내역 저장 
		$this->insert_service_used_history($user_id, $service_id, '', '', '', $cash, $point, $result_html_url);

		$this->db->trans_complete();

		if ($this->db->trans_status() === FALSE) {
			log_message('error', '## ==== 포인트 차감 DB업데이트중 에러 발생 ========================');
			die('에러 발생');
		}
	 }

	/**
	 * 패키지 쿠폰으로 결제
	 */
	 function payment_package($user_id, $service_group_id, $service_id, $package_cd, $result_html_url) {
	 	log_message('debug',"#### Unse_model::payment_package($user_id, $service_group_id, $service_id, $package_cd, $result_html_url)");
		
		$this->db->trans_start();
		
		// 쿠폰 idx를 가져온다.
		$result = $this->get_member_package($user_id);
		$coupon_idx = $result['idx'];
		
		// 쿠폰 차감 업데이트 
		$this->update_subtraction_package_coupon($coupon_idx, $service_group_id);
		
		// 운세 이용 내역 저장 
		$this->insert_service_used_history($user_id, $service_id, $service_group_id, $coupon_idx, '', 0, 0, $result_html_url);

		$this->db->trans_complete();

		if ($this->db->trans_status() === FALSE) {
			log_message('error', '## ==== 패키지 쿠폰 차감 DB업데이트중 에러 발생 ========================');
			die('에러 발생');
		}
	 }
	 
	/**
	 * 패키지 쿠폰차감 업데이트
	 */
	 function update_subtraction_package_coupon($coupon_idx, $service_group_id) {
	 	log_message('debug',"#### Unse_model::update_subtraction_package_coupon($coupon_idx, $service_group_id)");

		$this->db->set('qty'               , 'qty-1', FALSE);
		$this->db->where('idx'             , $coupon_idx);
		$this->db->where('service_group_id', $service_group_id);
		$this->db->update('tb_member_package_coupon') or $this->logsql->log_sql('error');

		$this->logsql->log_sql();
	}
	/**
	 * 개별이용권으로 결제
	 */
	 function payment_ticket($user_id, $service_group_id, $service_id, $ticket_idx, $result_html_url) {
	 	log_message('debug',"#### Unse_model::payment_ticket($user_id, $service_group_id, $service_id, $ticket_idx, $result_html_url)");
		
		$this->db->trans_start();
		
		// 개별이용권 사용된 상태로 업데이트 
		$this->update_ticket_used_yn($ticket_idx);
		
		// 운세 이용 내역 저장 
		$this->insert_service_used_history($user_id, $service_id, $service_group_id, '', $ticket_idx, 0, 0, $result_html_url);

		$this->db->trans_complete();

		if ($this->db->trans_status() === FALSE) {
			log_message('error', '## ==== 개별이용권 사용 DB업데이트중 에러 발생 ========================');
			die('에러 발생');
		}
	 }
	 
	 /**
	  * 개별 이용권 사용
	  */
	 function update_ticket_used_yn($ticket_idx) {
	 	log_message('debug',"#### Unse_model::update_ticket_used_yn($ticket_idx)");

		$this->db->set('used_yn'  , 'Y');
		$this->db->set('update_dt', 'now()', FALSE);
		$this->db->where('idx'    , $ticket_idx);
		$this->db->update('tb_ticket') or $this->logsql->log_sql('error');

		$this->logsql->log_sql();
	 }
	 
	 /**
	  * 이미 본 운세인지를 판단하고 다시보기html을 가져온다.
	  * 회원이 운세 내역을 삭제한것은 빼고 조회.
	  */
	 function get_result_html_url($user_id, $service_id, $userinfo) {
	 	log_message('debug',"#### Unse_model::get_result_html_url($user_id, $service_id, $userinfo)");
		
		$this->db->select('param_values, result_html_url');
		$this->db->where('user_id'      , $user_id);
		$this->db->where('service_id'   , $service_id);
		$this->db->where('secret_yn'    , 'N');
		$this->db->where('create_dt >= ', 'CURDATE() - INTERVAL 7 DAY ', FALSE);
        $query = $this->db->get('tb_service_used_history') or $this->logsql->log_sql('error');
		$result = $query->result_array();

		$this->logsql->log_sql();
		$this->logsql->log_result_with_title('이미 본 운세 DB 조회', $result);
		
		$this->logsql->log_result_with_title('비교 할 데이터 값', $userinfo);
		
		$cnt = 0;
		foreach ($result as $item) {
			$map_param = $this->_to_map($item['param_values']);
			$this->logsql->log_result($map_param);
			
			log_message('debug',"##################################################");
			foreach ($userinfo as $key => $value) {
				log_message('debug',"##[$key] $value == ".$map_param[$key]);
				if ($value == $map_param[$key]) {
					$cnt++;
				} else {
					continue;
				}
			}
			log_message('debug',"##count(userinfo) = ".count($userinfo).", cnt=$cnt");
			if (count($userinfo) == $cnt) {
				return $item['result_html_url'];
			}
			$cnt = 0;
		}

		return '';
	 }

	function _to_map($param_values) {
		$split = explode('&', $param_values);
		$map = array();
		
		foreach ($split as $item) {
			$tmp_split = explode('=', $item);
			if (isset($tmp_split[1])) {
				$map[$tmp_split[0]] = $tmp_split[1];
			}
		}
		return $map;
	}
	 
}

/* End of file unse_model.php */
/* Location: ./application/models/unse/unse_model.php */